/******************************************************************************/
/* @ All Rights Reserved Copyright (C) 2014 broada,Ltd.                       */
/*                                                                            */
/*  NAME      = frreport_opt.c                                                */
/*  NOTE      =                                                               */
/*  DATE      = 2016/01/11 by yaohl                                           */
/******************************************************************************/

#include <stdio.h>
#include <string.h>
#include <stdarg.h>

#include "frcomm.h"
#include "frlist.h"
#include "frlog.h"
#include "frsutl.h"

#include "frreport_opt.h"

/*******************************************************************************
*  FUNC     :  获取Frreport_body_data
*  ARGS     :  p_st_report_data          (Frreport_data *)
*  RTN      :  返回Frreport_body_data*
*  NOTE     :
*******************************************************************************/
FR_STATIC Frreport_body_data *__FrReportOpt_get_bodyData(Frreport_data *p_st_report_data)
{
    Frreport_body_data *p_st_body_data = NULL;
    Frlist_header *p_lst_hdr=NULL;

    if(p_st_report_data == NULL)
        return NULL;

    p_lst_hdr = &p_st_report_data->st_hdr_body;
    p_st_body_data = (Frreport_body_data *)FRLIST_GET_FISRT_NODE_DATA(p_lst_hdr);

    return p_st_body_data;
}

/*******************************************************************************
*  FUNC     :  获取MsgType
*  ARGS     :  p_st_report_data          (Frreport_data *)
*  RTN      :  返回message type
*  NOTE     :
*******************************************************************************/
Frreport_type_l7data FrReportOpt_get_messageType(Frreport_data *p_st_report_data)
{
    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA)
        return FRREPORT_TYPE_L7DATA_UNKONWN;

    return p_st_report_data->em_type_l7data;
}

/*******************************************************************************
*  FUNC     :  获取l4 protocol
*  ARGS     :  p_st_report_data          (Frreport_data *)
*  RTN      :  返回l4 protocol
*  NOTE     :  没有取得时,设置为0
*******************************************************************************/
u_short FrReportOpt_get_l4proto(Frreport_data *p_st_report_data)
{
    Frreport_body_data *p_st_body_data = NULL;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA)
        return 0;

    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
        return 0;

    return  p_st_body_data->un_data.st_l7data.ip_proto;
}

/*******************************************************************************
*  FUNC     :  获取l7 protocol
*  ARGS     :  p_st_report_data          (Frreport_data *)
*  RTN      :  返回l7 protocol
*  NOTE     :  没有取得时,设置为APM_L7_UNKNOWN
*******************************************************************************/
int FrReportOpt_get_l7proto(Frreport_data *p_st_report_data)
{
    Frreport_body_data *p_st_body_data = NULL;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA)
        return APM_L7_UNKNOWN;

    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
        return APM_L7_UNKNOWN;

    return p_st_body_data->un_data.st_l7data.i_l7_proto;
}

/*******************************************************************************
*  FUNC     :  设置l7 protocol
*  ARGS     :  p_st_report_data          (Frreport_data *)
*           ：  l7_proto                  (int)
*  RTN      :  0(FR_SUCC):成功; 1(FR_FAIL):失败
*  NOTE     :
*******************************************************************************/
int FrReportOpt_set_l7proto(Frreport_data *p_st_report_data, int i_l7_proto)
{
    Frreport_body_data *p_st_body_data = NULL;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA
       || i_l7_proto < 0)
        return FR_FAIL;

    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
        return FR_FAIL;

    p_st_body_data->un_data.st_l7data.i_l7_proto = i_l7_proto;
    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  获取src ip
*  ARGS     :  p_st_report_data          (Frreport_data *)
*  RTN      :  返回src ip                 (u_int)
*  NOTE     :  没有取得时,设置为0
*******************************************************************************/
u_int FrReportOpt_get_srcIp(Frreport_data *p_st_report_data)
{
    Frreport_body_data *p_st_body_data = NULL;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA)
        return 0;

    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
        return 0;

    return p_st_body_data->un_data.st_l7data.src_ip;
}

/*******************************************************************************
*  FUNC     :  获取src port
*  ARGS     :  p_st_report_data          (Frreport_data *)
*  RTN      :  返回src port
*  NOTE     :  没有取得时,设置为0
*******************************************************************************/
u_short FrReportOpt_get_srcPort(Frreport_data *p_st_report_data)
{
    Frreport_body_data *p_st_body_data = NULL;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA)
        return 0;

    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
        return 0;

    return p_st_body_data->un_data.st_l7data.src_port;
}

/*******************************************************************************
*  FUNC     :  获取dest ip
*  ARGS     :  p_st_report_data          (Frreport_data *)
*  RTN      :  返回dest ip                (u_int)
*  NOTE     :  没有取得时,设置为0
*******************************************************************************/
u_int FrReportOpt_get_dstIp(Frreport_data *p_st_report_data)
{
    Frreport_body_data *p_st_body_data = NULL;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA)
        return 0;

    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
        return 0;

    return p_st_body_data->un_data.st_l7data.dst_ip;
}

/*******************************************************************************
*  FUNC     :  获取dest port
*  ARGS     :  p_st_report_data          (Frreport_data *)
*  RTN      :  返回dest port
*  NOTE     :  没有取得时,设置为0
*******************************************************************************/
u_short FrReportOpt_get_dstPort(Frreport_data *p_st_report_data)
{
    Frreport_body_data *p_st_body_data = NULL;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA)
        return 0;

    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
        return 0;

    return p_st_body_data->un_data.st_l7data.dst_port;
}

/*******************************************************************************
*  FUNC     :  设置src ip
*  ARGS     :  p_st_report_data         (Frreport_data *)
*           :  p_src_ip                 (eg.192.168.18.20)
*  RTN      :  0(FR_SUCC):成功; 1(FR_FAIL):失败
*  NOTE     :
*******************************************************************************/
int FrReportOpt_set_srcIp(Frreport_data *p_st_report_data, const char *p_src_ip)
{
    Frreport_body_data *p_st_body_data = NULL;
    u_int ui_ip=0;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA
       || p_src_ip == NULL || *p_src_ip == '\0')
    {
        FRLOG_WARN_DETAIL("input parameter err");
        return FR_FAIL;
    }

    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
        return FR_FAIL;

    ui_ip = iptools_parse_ipaddr(p_src_ip);
    p_st_body_data->un_data.st_l7data.src_ip = ui_ip;

    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  设置src ip
*  ARGS     :  p_st_report_data         (Frreport_data *)
*           :  ui_src_ip                (原ip)
*  RTN      :  0(FR_SUCC):成功; 1(FR_FAIL):失败
*  NOTE     :
*******************************************************************************/
int FrReportOpt_set_srcIp2(Frreport_data *p_st_report_data, u_int ui_src_ip)
{
    Frreport_body_data *p_st_body_data = NULL;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA)
    {
        FRLOG_WARN_DETAIL("input parameter err");
        return FR_FAIL;
    }

    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
        return FR_FAIL;

    p_st_body_data->un_data.st_l7data.src_ip = ui_src_ip;

    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  设置src port
*  ARGS     :  p_st_report_data          (Frreport_data *)
*           ：  p_src_port                (u_short)
*  RTN      :  0(FR_SUCC):成功; 1(FR_FAIL):失败
*  NOTE     :
*******************************************************************************/
int FrReportOpt_set_srcPort(Frreport_data *p_st_report_data, u_short u_port)
{
    Frreport_body_data *p_st_body_data = NULL;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA)
        return FR_FAIL;

    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
        return FR_FAIL;

    p_st_body_data->un_data.st_l7data.src_port = u_port;
    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  设置dst ip
*  ARGS     :  p_st_report_data         (Frreport_data *)
*           :  p_dst_ip                 (eg.192.168.18.20)
*  RTN      :  0(FR_SUCC):成功; 1(FR_FAIL):失败
*  NOTE     :
*******************************************************************************/
int FrReportOpt_set_dstIp(Frreport_data *p_st_report_data, const char *p_dst_ip)
{
    Frreport_body_data *p_st_body_data = NULL;
    u_int ui_ip=0;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA
       || p_dst_ip == NULL || *p_dst_ip == '\0')
    {
        FRLOG_WARN_DETAIL("input parameter err");
        return FR_FAIL;
    }

    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
        return FR_FAIL;

    ui_ip = iptools_parse_ipaddr(p_dst_ip);
    p_st_body_data->un_data.st_l7data.dst_ip = ui_ip;

    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  设置dst ip
*  ARGS     :  p_st_report_data         (Frreport_data *)
*           :  ui_dst_ip                (目的ip)
*  RTN      :  0(FR_SUCC):成功; 1(FR_FAIL):失败
*  NOTE     :
*******************************************************************************/
int FrReportOpt_set_dstIp2(Frreport_data *p_st_report_data, u_int ui_dst_ip)
{
    Frreport_body_data *p_st_body_data = NULL;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA)
    {
        FRLOG_WARN_DETAIL("input parameter err");
        return FR_FAIL;
    }

    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
        return FR_FAIL;

    p_st_body_data->un_data.st_l7data.dst_ip = ui_dst_ip;

    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  设置dest port
*  ARGS     :  p_st_report_data          (Frreport_data *)
*           ：  p_dst_port                (u_short)
*  RTN      :  0(FR_SUCC):成功; 1(FR_FAIL):失败
*  NOTE     :
*******************************************************************************/
int FrReportOpt_set_dstPort(Frreport_data *p_st_report_data, u_short u_port)
{
    Frreport_body_data *p_st_body_data = NULL;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA)
        return FR_FAIL;

    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
        return FR_FAIL;

    p_st_body_data->un_data.st_l7data.dst_port = u_port;
    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  获取指定数据大小
*  ARGS     :  p_st_report_data         (Frreport_data *)
*           :  p_key                    (字段名 const char*)
*  RTN      :  指定字段的个数
*  NOTE     :  出错返回0
*******************************************************************************/
int FrReportOpt_get_fieldSize(Frreport_data *p_st_report_data, const char *p_key)
{
    Frreport_body_data *p_st_body_data = NULL;
    int i_count = 0, i_key_len=0;
    char arr_key_name[256];
    Frlist_header *p_lst_hdr=NULL;
    Frlist_node *p_st_node=NULL;
    Frvar_field *p_st_field=NULL;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA
       || p_key == NULL || *p_key == '\0')
        return 0;

    //获取Frreport_body_data
    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
        return 0;

    p_lst_hdr = frreport_body_l7_get_hdr(p_st_body_data, p_key);
    if(p_lst_hdr == NULL)
        return 0;

    //查询节点
    snprintf(arr_key_name, sizeof(arr_key_name), "%s.", p_key);
    i_key_len = strlen(arr_key_name);
    p_st_node = FRLIST_FIRST_NODE(p_lst_hdr);
    while(p_st_node)
    {
        p_st_field =  (Frvar_field*)FRLIST_GET_NODE_DATA(p_st_node);
        if(p_st_field == NULL)
        {
            p_st_node = FRLIST_NEXT_NODE(p_st_node);
            continue;
        }
        if( p_st_field->p_field_name
            && strlen(p_st_field->p_field_name) == i_key_len+1
            && strncmp(p_st_field->p_field_name, arr_key_name, i_key_len) == 0 )
        {
            i_count++;
        }
        p_st_node = FRLIST_NEXT_NODE(p_st_node);
    }

    return i_count;
}

/*******************************************************************************
*  FUNC     :  判断某个指定key是否存在
*  ARGS     :  p_st_report_data         (Frreport_data *)
*           :  p_key                    (字段名 char*)
*  RTN      :  true(1):存在 false(0):不存在/出错
*  NOTE     :  出错返回 false
*******************************************************************************/
int FrReportOpt_get_existsField(Frreport_data *p_st_report_data, const char *p_key)
{
    Frreport_body_data *p_st_body_data = NULL;
    int i_exists = 0, i_key_len=0;
    char arr_key_name[256];
    Frlist_header *p_lst_hdr=NULL;
    Frlist_node *p_st_node=NULL;
    Frvar_field *p_st_field=NULL;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA
       || p_key == NULL || *p_key == '\0')
        return FR_NO;

    //获取Frreport_body_data
    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
        return FR_NO;

    p_lst_hdr = frreport_body_l7_get_hdr(p_st_body_data, p_key);
    if(p_lst_hdr == NULL)
        return FR_NO;

    //查询节点
    snprintf(arr_key_name, sizeof(arr_key_name), "%s.", p_key);
    i_key_len = strlen(arr_key_name);

    p_st_node = FRLIST_FIRST_NODE(p_lst_hdr);
    while(p_st_node)
    {
        p_st_field =  (Frvar_field*)FRLIST_GET_NODE_DATA(p_st_node);
        if(p_st_field == NULL)
        {
            p_st_node = FRLIST_NEXT_NODE(p_st_node);
            continue;
        }
        if( p_st_field->p_field_name
            && strlen(p_st_field->p_field_name) == i_key_len+1
            && strncmp(p_st_field->p_field_name, arr_key_name, i_key_len) == 0 )
        {
            i_exists=1;
            break;
        }
        p_st_node = FRLIST_NEXT_NODE(p_st_node);
    }

    if(i_exists)
        return FR_YES;
    else
        return FR_NO;
}

/*******************************************************************************
*  FUNC     :  获取解析数据
*  ARGS     :  p_st_report_data         (Frreport_data *)
*           :  p_key                    (字段名 char*)
*           :  i_index                  (表示数组下标，从0开始)
*  RTN      :  指定字段名的内容(原数据的引用)
*  NOTE     :
*******************************************************************************/
Frvar_field *FrReportOpt_get_field(Frreport_data *p_st_report_data, const char *p_key, int i_index)
{
    Frreport_body_data *p_st_body_data = NULL;
    int i_pos=0, i_key_len=0;
    char arr_key_name[256];
    Frlist_header *p_lst_hdr=NULL;
    Frlist_node *p_st_node=NULL;
    Frvar_field *p_st_field=NULL;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA
       || p_key == NULL || *p_key == '\0' )
        return NULL;

    //获取Frreport_body_data
    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
        return NULL;

    p_lst_hdr = frreport_body_l7_get_hdr(p_st_body_data, p_key);
    if(p_lst_hdr == NULL)
        return NULL;

    if(i_index < 0)
        i_index = 0;

    //查询节点
    i_pos=0;
    snprintf(arr_key_name, sizeof(arr_key_name), "%s.", p_key);
    i_key_len = strlen(arr_key_name);

    p_st_node = FRLIST_FIRST_NODE(p_lst_hdr);
    while(p_st_node)
    {
        p_st_field =  (Frvar_field*)FRLIST_GET_NODE_DATA(p_st_node);
        if(p_st_field == NULL)
        {
            p_st_node = FRLIST_NEXT_NODE(p_st_node);
            continue;
        }
        if( p_st_field->p_field_name
            && strlen(p_st_field->p_field_name) == i_key_len+1 //最后1位表示数据类型
            && strncmp(p_st_field->p_field_name, arr_key_name, i_key_len) == 0 )
        {
            if(i_pos++ < i_index)
            {
                p_st_node = FRLIST_NEXT_NODE(p_st_node);
                continue;
            }

            return p_st_field;
        }
        p_st_node = FRLIST_NEXT_NODE(p_st_node);
    }

    return NULL;
}

/*******************************************************************************
*  FUNC     :  加入解析数据
*  ARGS     :  p_st_report_data         (Frreport_data *)
*           :  p_key                    (字段名 const char*)
*           :  p_value                  (解析数据 const char*)
*  RTN      :  0(FR_SUCC):成功; 1(FR_FAIL):失败
*  NOTE     :
*******************************************************************************/
int FrReportOpt_add_fieldStr(Frreport_data *p_st_report_data, const char *p_key, const char *p_value)
{
    Frreport_body_data *p_st_body_data = NULL;
    int i_ret_fun=0;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA
       || p_key == NULL || *p_key == '\0')
    {
        FRLOG_WARN_DETAIL("input parameter err");
        return FR_FAIL;
    }

    //获取Frreport_body_data
    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
    {
        FRLOG_WARN_DETAIL("Frreport_body_data is NULL");
        return FR_FAIL;
    }

    i_ret_fun = frreport_body_l7_add_str(p_st_body_data, p_key, p_value);
    if(i_ret_fun == FR_FAIL)
        return FR_FAIL;
    else
        return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  加入解析数据
*  ARGS     :  p_st_report_data         (Frreport_data *)
*           :  p_key                    (字段名 const char*)
*           :  i_value                  (解析数据 int)
*  RTN      :  0(FR_SUCC):成功; 1(FR_FAIL):失败
*  NOTE     :
*******************************************************************************/
int FrReportOpt_add_fieldLong(Frreport_data *p_st_report_data, const char *p_key, long l_value)
{
    Frreport_body_data *p_st_body_data = NULL;
    int i_ret_fun=0;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA
       || p_key == NULL || *p_key == '\0')
    {
        FRLOG_WARN_DETAIL("input parameter err");
        return FR_FAIL;
    }

    //获取Frreport_body_data
    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
    {
        FRLOG_WARN_DETAIL("Frreport_body_data is NULL");
        return FR_FAIL;
    }

    i_ret_fun = frreport_body_l7_add_long(p_st_body_data, p_key, l_value);
    if(i_ret_fun == FR_FAIL)
        return FR_FAIL;
    else
        return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  加入解析数据
*  ARGS     :  p_st_report_data         (Frreport_data *)
*           :  p_key                    (字段名 const char*)
*           :  d_value                  (解析数据 double)
*  RTN      :  0(FR_SUCC):成功; 1(FR_FAIL):失败
*  NOTE     :
*******************************************************************************/
int FrReportOpt_add_fieldDouble(Frreport_data *p_st_report_data, const char *p_key, double d_value)
{
    Frreport_body_data *p_st_body_data = NULL;
    int i_ret_fun=0;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA
       || p_key == NULL || *p_key == '\0')
    {
        FRLOG_WARN_DETAIL("input parameter err");
        return FR_FAIL;
    }

    //获取Frreport_body_data
    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
    {
        FRLOG_WARN_DETAIL("Frreport_body_data is NULL");
        return FR_FAIL;
    }

    i_ret_fun = frreport_body_l7_add_double(p_st_body_data, p_key, d_value);
    if(i_ret_fun == FR_FAIL)
        return FR_FAIL;
    else
        return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  删除所有相同节点名
*  ARGS     :  p_st_report_data         (Frreport_data *)
*           :  p_key                    (字段名 const char*)
*  RTN      :  0(FR_SUCC):成功; 1(FR_FAIL):失败
*  NOTE     :
*******************************************************************************/
int FrReportOpt_del_fieldAll(Frreport_data *p_st_report_data, const char *p_key)
{
    Frreport_body_data *p_st_body_data = NULL;
    int i_ret_fun=0;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA
       || p_key == NULL || *p_key == '\0')
    {
        FRLOG_WARN_DETAIL("input parameter err");
        return FR_FAIL;
    }

    //获取Frreport_body_data
    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
    {
        FRLOG_WARN_DETAIL("Frreport_body_data is NULL");
        return FR_FAIL;
    }

    i_ret_fun = frreport_body_l7_del_all(p_st_body_data, p_key);
    if(i_ret_fun == FR_FAIL)
        return FR_FAIL;
    else
        return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  l7data里删除指定节点名的第ui_index个
*  ARGS     :  p_st_report_data         (Frreport_data *)
*           :  p_key                    (字段名 const char*)
*           :  i_index                  (从0开始)
*  RTN      :  0(FR_SUCC):成功; 1(FR_FAIL):失败
*  NOTE     :
*******************************************************************************/
int FrReportOpt_del_fieldIndex(Frreport_data *p_st_report_data, const char *p_key, int i_index)
{
    Frreport_body_data *p_st_body_data = NULL;
    int i_ret_fun=0;

    if(p_st_report_data == NULL || p_st_report_data->em_type != FRREPORT_TYPE_L7DATA
       || p_key == NULL || *p_key == '\0' || i_index < 0)
    {
        FRLOG_WARN_DETAIL("input parameter err");
        return FR_FAIL;
    }

    //获取Frreport_body_data
    p_st_body_data = __FrReportOpt_get_bodyData(p_st_report_data);
    if(p_st_body_data == NULL)
    {
        FRLOG_WARN_DETAIL("Frreport_body_data is NULL");
        return FR_FAIL;
    }

    i_ret_fun = frreport_body_l7_del_index(p_st_body_data, p_key, i_index);
    if(i_ret_fun == FR_FAIL)
        return FR_FAIL;
    else
        return FR_SUCC;
}


/*******************************************************************************
*  FUNC     :  l7data里删除指定节点名的第ui_index个
*  ARGS     :  p_st_report_data         (Frreport_data *)
*           :  i_flag_style             (0:无格式化输出; 其它:格式化输出)
*  RTN      :  数据:成功; NULL:失败
*  NOTE     :  需要外部释放数据
*******************************************************************************/
char* FrReportOpt_dumpField(Frreport_data *p_st_report_data, int i_flag_style)
{
    char *p_msg=NULL;

    if(p_st_report_data == NULL)
    {
        FRLOG_WARN_DETAIL("input parameter err");
        return NULL;
    }

    if(i_flag_style)
        p_msg = frreport_data_output(p_st_report_data, FR_YES);
    else
        p_msg = frreport_data_output(p_st_report_data, FR_NO);

    return p_msg;
}

